// 定义包名，与Contact类在同一个包中
package flutter.plugins.contactsservice.contactsservice;

// 导入Android资源类，用于获取本地化字符串
import android.content.res.Resources;
// 导入数据库游标类，用于从联系人数据库中读取数据
import android.database.Cursor;

// 静态导入联系人合约中的CommonDataKinds类，简化代码
import static android.provider.ContactsContract.CommonDataKinds;

// 导入HashMap类，用于数据转换
import java.util.HashMap;

/**
 * 表示具有标签和值的对象
 * 例如电话号码或电子邮件地址
 * 这个类用于存储联系人中的电话、邮箱等信息项
 */
public class Item {

    // 标签字段，如"home"、"work"等，公开访问
    public String label;
    // 值字段，如电话号码或邮箱地址，公开访问
    public String value;
    // 类型字段，存储Android系统定义的类型常量，私有访问
    int type;

    /**
     * 构造函数
     * @param label 项目的标签（如home、work）
     * @param value 项目的值（如电话号码或邮箱地址）
     * @param type 项目的类型代码（Android系统定义的常量）
     */
    public Item(String label, String value, int type) {
        // 初始化字段
        this.label = label;
        this.value = value;
        this.type = type;
    }

    /**
     * 将Item对象转换为HashMap
     * 用于与Flutter端进行数据交换
     * @return 包含Item信息的HashMap
     */
    HashMap<String, String> toMap() {
        // 创建一个新的HashMap对象
        HashMap<String, String> result = new HashMap<>();
        // 将Item的三个属性添加到HashMap中
        result.put("label", label);
        result.put("value", value);
        result.put("type", String.valueOf(type)); // 将整数类型转换为字符串
        // 返回创建好的HashMap
        return result;
    }

    /**
     * 从HashMap创建Item对象
     * 用于从Flutter端接收数据
     * @param map 包含Item信息的HashMap
     * @return 创建的Item对象
     */
    public static Item fromMap(HashMap<String, String> map) {
        // 从HashMap中获取各个字段的值
        String label = map.get("label");
        String value = map.get("value");
        String typeStr = map.get("type");

        // 将type字段从字符串转换为整数
        // 如果type为null，则使用默认值-1表示未知类型
        int type = typeStr != null ? Integer.parseInt(typeStr) : -1;

        // 创建并返回新的Item对象
        return new Item(label, value, type);
    }

    /**
     * 获取电话号码的标签文本
     * @param resources Android资源对象，用于获取本地化文本
     * @param type 电话类型常量（Android系统定义）
     * @param cursor 数据库游标，用于读取自定义标签
     * @param localizedLabels 是否使用本地化标签
     * @return 电话标签的文本表示
     */
    public static String getPhoneLabel(Resources resources, int type, Cursor cursor, boolean localizedLabels) {
        // 如果需要使用本地化标签
        if (localizedLabels) {
            // 使用Android系统提供的方法获取本地化的标签文本
            CharSequence localizedLabel = CommonDataKinds.Phone.getTypeLabel(resources, type, "");
            // 转换为字符串并转为小写返回
            return localizedLabel.toString().toLowerCase();
        } else {
            // 如果不使用本地化标签，返回英文标签
            switch (type) {
                case CommonDataKinds.Phone.TYPE_HOME: // 家庭电话
                    return "home";
                case CommonDataKinds.Phone.TYPE_WORK: // 工作电话
                    return "work";
                case CommonDataKinds.Phone.TYPE_MOBILE: // 移动电话
                    return "mobile";
                case CommonDataKinds.Phone.TYPE_FAX_WORK: // 工作传真
                    return "fax work";
                case CommonDataKinds.Phone.TYPE_FAX_HOME: // 家庭传真
                    return "fax home";
                case CommonDataKinds.Phone.TYPE_MAIN: // 主要电话
                    return "main";
                case CommonDataKinds.Phone.TYPE_COMPANY_MAIN: // 公司总机
                    return "company";
                case CommonDataKinds.Phone.TYPE_PAGER: // 寻呼机
                    return "pager";
                case CommonDataKinds.Phone.TYPE_CUSTOM: // 自定义类型
                    // 从数据库游标中获取自定义标签
                    if (cursor.getString(cursor.getColumnIndex(CommonDataKinds.Phone.LABEL)) != null) {
                        return cursor.getString(cursor.getColumnIndex(CommonDataKinds.Phone.LABEL)).toLowerCase();
                    } else return "";
                default: // 其他类型
                    return "other";
            }
        }
    }

    /**
     * 获取电子邮件的标签文本
     * 与getPhoneLabel方法类似，但用于处理邮箱类型
     * @param resources Android资源对象，用于获取本地化文本
     * @param type 邮箱类型常量（Android系统定义）
     * @param cursor 数据库游标，用于读取自定义标签
     * @param localizedLabels 是否使用本地化标签
     * @return 邮箱标签的文本表示
     */
    public static String getEmailLabel(Resources resources, int type, Cursor cursor, boolean localizedLabels) {
        // 如果需要使用本地化标签
        if (localizedLabels) {
            // 使用Android系统提供的方法获取本地化的标签文本
            CharSequence localizedLabel = CommonDataKinds.Email.getTypeLabel(resources, type, "");
            // 转换为字符串并转为小写返回
            return localizedLabel.toString().toLowerCase();
        } else {
            // 如果不使用本地化标签，返回英文标签
            switch (type) {
                case CommonDataKinds.Email.TYPE_HOME: // 家庭邮箱
                    return "home";
                case CommonDataKinds.Email.TYPE_WORK: // 工作邮箱
                    return "work";
                case CommonDataKinds.Email.TYPE_MOBILE: // 移动邮箱
                    return "mobile";
                case CommonDataKinds.Email.TYPE_CUSTOM: // 自定义类型
                    // 从数据库游标中获取自定义标签
                    if (cursor.getString(cursor.getColumnIndex(CommonDataKinds.Email.LABEL)) != null) {
                        return cursor.getString(cursor.getColumnIndex(CommonDataKinds.Email.LABEL)).toLowerCase();
                    } else return "";
                default: // 其他类型
                    return "other";
            }
        }
    }
}